#encoding=utf8


import logging


def no_check(player):
	return list()


def gandr_check(player):
	if player.get('gandr'):
		return [ [0] ]
	else:
		return list()


def charge_check(player):
	if 6 in player.get('dice'):
		if player.get('charge')<2 or player.get('flame'):
			return [ [6] ]
	return list()


def pair_check_fac(pair):
	def pair_check(player):
		rst = list()
		dices = player.get('dice')
		for i in pair:
			if dices.count(i)>=2:
				rst.append([i, i])
		return rst		
	return pair_check


def sneak_check(player):
	if 1 in player.get('dice'):
		return [ [1] ]
	return list()


def crippling_check(player):
	rst = list()
	dices = player.get('dice')
	for m in range(1,7):
		for n in range(1,7):
			if m==n and dices.count(m)>=5:
				rst.append([m for i in range(0,5)])
			elif m!=n and dices.count(m)>=2 and dices.count(n)>=3:
				rst.append([m,m,n,n,n])
	return rst			


def kind_check_fac(time):
	def kind_check(player):
		rst = list()
		dices = player.get('dice')
		for i in range(1,7):
			if dices.count(i)>=time:
				rst.append([i for t in range(0,time)])
		return rst
	return kind_check


def straight_check_fac(m):
	def straight_check(player):
		rst = list()
		dices = player.get('dice')
		n = m
		if player.get('holysymbol'):
			n = n-1
		for i in range(1,8-n):
			ok = True
			combo = [i+step for step in range(0,n)]
			for dc in combo:
				if dices.count(dc)==0:
					ok = False
					break
			if ok:
				rst.append(combo)
		return rst
	return straight_check


def set_check_fac(st):
	def set_check(player):
		ok = True
		if len(player.get('dice'))!=6:
			return list()
		for d in player.get('dice'):
			if not d in st:
				ok = False
				break
		if ok:
			return [ player.get('dice') ]
		else:
			return list()
	return set_check	


def sixed_dice(combo, player):
	dices = player.get('dice_old')[:]
	for d in combo:
		dices.remove(d)
	if len(dices)>=1:	
		return dices[len(dices)-1]	
	else:
		return 0


def decEnemysHpFac(hit):
	def decEnemysHp(c, r, player):
		for enemy in player.get('enemy'):
			enemy['hp'] = enemy['hp'] - hit
			enemy['round_hurt'] = enemy.get('round_hurt') + hit
			if enemy.get('hp')<0:
				enemy['hp'] = 0
	return decEnemysHp			


def killEnemy(c, rh, player):
	enemys = player.get('enemy')
	for enemy in enemys:
		select = rh.request.get('hurt_%d' % enemys.index(enemy))
		if select=='kill':
			enemy['hp'] = 0
			return


def killAll(c, rh, player):
	for enemy in player.get('enemy'):
		enemy['hp'] = 0
	for mem in player.get('team'):
		if mem.get('data').get('epic')=='gandr':
			mem['hp'] = 0
			mem['st'] = -1


def resurrectTeam(c, rh, player):
	for member in player.get('team'):
		select = rh.request.get(member.get('data').get('name'))
		if select=='resurrection' and member.get('st')==0:
			member['st'] = 1
			member['hp'] = member.get('data').get('hp')
			return


def decEnemyDices(c, rh, player):
	player['dec_enemy_dice'] = player.get('dec_enemy_dice') + 2


skills = [
		{
			'name': 'charge',
			'title': '冲锋',
			'checker': charge_check,
			'job': 'fighter',
			'eff1': lambda combo, player: -1,
			'desc': '每个[6]造成1点伤害，但是每回合只能使用2次冲锋。',
			},

		{
			'name': 'flame',
			'title': '狂暴',
			'checker': no_check,
			'job': 'fighter',
			'desc': '每回合不限制冲锋使用次数。（需求：史诗道具卡）',
			},

		{
			'name': 'lay',
			'title': '圣疗',
			'checker': pair_check_fac([1,2,3]),
			'job': 'paladin',
			'eff1': lambda combo, player: 1,
			'desc': '每对[1][1]或者[2][2]或者[3][3]，治疗1点伤害。',
			},

		{
			'name': 'wieldsword',
			'title': '神圣裁决',
			'checker': pair_check_fac([4,5,6]),
			'job': 'paladin',
			'eff1': lambda combo, player: -1,
			'desc': '每对[4][4]或者[5][5]或者[6][6]造成1点伤害。',
			},

		{
			'name': 'divinity',
			'title': '上帝之书',
			'checker': no_check,
			'job': 'paladin',
			'desc': '圣疗能够将死者复活。（需求：史诗道具卡）',
			},

		{
			'name': 'sneak',
			'title': '偷袭',
			'checker': sneak_check,
			'job': 'rogue',
			'eff1': lambda combo, player: (player.get('subtlety') and -2) or -1,
			'desc': '每个[1]造成1点伤害。',
			},

		{
			'name': 'crippling',
			'title': '致命',
			'checker': crippling_check,
			'job': 'rogue',
			'eff1': lambda combo, player: (player.get('subtlety') and -2 * sixed_dice(combo, player)) or -1 * sixed_dice(combo, player),
			'desc': '1对加上3个相同数（如：22555），伤害值为第6个骰子的数值。',
			},

		{
			'name': 'trap',
			'title': '躲避陷阱',
			'checker': no_check,
			'job': 'rogue',
			'desc': '任何时候发现陷阱，掷1个骰子，如果是[1]或者[2]或者[3]，忽略陷阱。',
			},

		{
				'name': 'subtlety',
				'title': '剑法精妙',
				'checker': no_check,
				'job': 'rogue',
				'desc': '游侠造成的伤害翻倍。（需求：史诗道具卡）',
				},

		{
				'name': 'range',
				'title': '先手',
				'checker': no_check,
				'job': 'ranger',
				'desc': '在战斗之前，掷6个骰子，每对造成2点伤害。',
				},

		{
				'name': 'dualwield',
				'title': '双手斧',
				'checker': pair_check_fac([1,2,3,4,5,6]),
				'job': 'ranger',
				'eff1': lambda combo, player: -1,
				'desc': '每对造成1点伤害。',
				},

		{
				'name': 'evasion',
				'title': '闪避',
				'checker': no_check,
				'job': 'ranger',
				'desc': '每使用1个双手斧技能，减少敌人普通攻击时的1个骰子。',
				},

		{
				'name': 'elvenbow',
				'title': '精灵弓',
				'checker': no_check,
				'job': 'ranger',
				'desc': '在战斗之前，使用两次先手技能。（需求：史诗道具卡）',
				},

		{
				'name': 'confusion',
				'title': '混乱',
				'checker': kind_check_fac(3),
				'job': 'wizard',
				'eff1': lambda c,p: '*',
				'eff2': decEnemyDices,
				'desc': '3个相同数，减少敌人普通攻击时的2个骰子。',
				},

		{
				'name': 'lighting',
				'title': '闪电链',
				'checker': kind_check_fac(4),
				'job': 'wizard',
				'eff1': lambda c,p: '*',
				'eff2': decEnemysHpFac(1),
				'desc': '4个相同数，对每个敌人造成1点伤害。',
				},

		{
				'name': 'fireball',
				'title': '火球',
				'checker': kind_check_fac(5),
				'job': 'wizard',
				'eff1': lambda c,p: -6,
				'desc': '5个相同数，造成6点伤害。',
				},

		{
				'name': 'kill',
				'title': '即死',
				'checker': kind_check_fac(6),
				'job': 'wizard',
				'eff1': lambda c,p: '*',
				'eff2': killEnemy,
				'desc': '6个相同数，立即杀死一个敌人。',
				},

		{
				'name': 'gandr',
				'title': '献祭',
				'checker': gandr_check,
				'job': 'wizard',
				'eff1': lambda c,p: '*',
				'eff2': killAll,
				'desc': '牺牲术士，立即杀死所有敌人。（需求：诗史道具卡）',
				},

		{
				'name': 'icewall',
				'title': '冰墙',
				'checker': kind_check_fac(3),
				'job': 'sorcerer',
				'eff1': lambda c,p: '*',
				'desc': '3个相同数，本回合双方不能造成伤害。',
				},
		
		{
				'name': 'whilrwind',
				'title': '强风',
				'checker': kind_check_fac(4),
				'job': 'sorcerer',
				'eff1': lambda c,p: '*',
				'desc': '4个相同数，对每个敌人和1个队友造成1点伤害。',
				},

		{
				'name': 'firestorm',
				'title': '烈焰风暴',
				'checker': kind_check_fac(5),
				'job': 'sorcerer',
				'eff1': lambda c,p: '*',
				'desc': '5个相同数，对每个敌人和1个队友造成3点伤害。',
				},

		{
				'name': 'earthquake',
				'title': '地震',
				'checker': kind_check_fac(6),
				'job': 'sorcerer',
				'eff1': lambda c,p: '*',
				'desc': '6个相同数，对每个敌人和1个队友造成5点伤害。',
				},

		{
				'name': 'resistance',
				'title': '法术抵抗',
				'checker': no_check,
				'job': 'sorcerer',
				'desc': '忽略法师对队友造成的伤害。（需求：诗史道具卡）',
				},

		#{
		#		'name': 'smite',
		#		'title': '神圣重击',
		#		'checker': straight_check_fac(3),
		#		'job': 'cleric',
		#		'eff1': lambda c,p: -2,
		#		'desc': '3个连续数，造成2点伤害。',
		#		},

		{
				'name': 'minorheal',
				'title': '小治疗',
				'checker': straight_check_fac(4),
				'job': 'cleric',
				'eff1': lambda c,p: 2,
				'desc': '4个连续数，治疗2点伤害。',
				},

		{
				'name': 'heal',
				'title': '大治疗',
				'checker': straight_check_fac(5),
				'job': 'cleric',
				'eff1': lambda combo, player: sixed_dice(combo, player),
				'desc': '5个连续数，治疗量为第6个骰子的数值。',
				},

		{
				'name': 'resurrection',
				'title': '复活',
				'checker': straight_check_fac(6),
				'job': 'cleric',
				'eff1': lambda c,p: '*',
				'eff2': resurrectTeam,
				'desc': '复6个连续数，活1名队友到满血状态。',
				},

		{
				'name': 'holysymbol',
				'title': '圣辉',
				'checker': no_check,
				'job': 'cleric',
				'desc': '牧师技能发动可减少1个骰子。（需求：诗史道具卡）',
				},

		{
				'name': 'cure',
				'title': '治疗',
				'checker': set_check_fac([1,2,3]),
				'job': 'druid',
				'eff1': lambda combo, player: combo.count(1),
				'desc': '所有骰子是[1]或者[2]或者[3]，每个[1]治疗1点伤害，用光所有骰子。',
				},

		{
				'name': 'fury',
				'title': '自然之怒',
				'checker': set_check_fac([4,5,6]),
				'job': 'druid',
				'eff1': lambda combo, player: -1 * combo.count(6),
				'desc': '所有骰子是[4]或者[5]或者[6]，每个[6]造成1点伤害，用光所有骰子。',
				},

		{
				'name': 'entangling',
				'title': '缠绕',
				'checker': no_check,
				'job': 'druid',
				'desc': '每场战斗的第1回合，敌人不能行动。（需求：诗史道具卡）',
				},
		]


skillmap = dict()
for skill in skills:
	skillmap[skill.get('name')] = skill
